/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedbean;

import entity.Persona;
import java.io.IOException;
import java.io.Serializable;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import utility.ExceptionThrower;
import utility.ResourceBundleLoader;

/**
 *
 * @author Antonio
 */
public class Redirect implements Serializable {

    public static boolean accesso;
    public static Persona persona;

    public static void setPersona(Persona p) {

        persona = p;
    }

    public static Persona getPersona() {

        return persona;
    }

    public boolean getAccesso() {
        return accesso;
    }

    /**
     * Get the value of accesso
     *
     * @return the value of accesso
     */
    public static boolean isAccesso() {
        return accesso;
    }

    /**
     * Set the value of accesso
     *
     * @param accesso new value of accesso
     */
    public static void setAccesso(boolean accesso) {
        Redirect.accesso = accesso;
    }

    /**
     * Il metodo consente di effettuare un redirect sulla pagina passata come
     * parametro. Se il parametro e' null il redirect sara' fatto sull'
     * index.jsf. LOGIN NON NECESSARIO
     *
     * @param pageJSF Pagina JSF su cui effettuare il redirect, se e' null il
     * redirect sara' fatto sull' index.jsf
     */
    public void redirect(String pageJSF) {

        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        try {

            if (pageJSF == null) {

                ec.redirect("");
            } else {

                ec.redirect(pageJSF);
            }
        } catch (IOException e) {
        }

    }// redirect

    /**
     * Il metodo effettua il redirect: se flag = true il redirect avviene se il
     * login e' stato effettuato; se flag = false il redirect avviene se il
     * login non e' stato effettuato.
     *
     * @param pageJSF Pagina JSF su cui effettuare il redirect, se e' null il
     * redirect sara' fatto sull' index.jsf.
     *
     * @param flag true per login effettuato, false per login non effettuato.
     */
    public void redirectLogin(String pageJSF, boolean flag) {

        if (!this.accesso && !flag || this.accesso && flag) {

            this.redirect(pageJSF);
        }
    }// redirectLogin

    /**
     * Consente di effettuare un redirect in caso in cui si cerca di accedere
     * con un account diverso dal cliente.
     *
     * @param gestioneCliente se l'id e' null attiva il redirect.
     *
     * @param pageJSF Pagina su cui effettuare il redirect, se null il redirect
     * avviene sull'index.
     */
    public void redirectCliente(GestioneCliente gestioneCliente, String pageJSF) {


        if (gestioneCliente.getId() == null) {

            this.redirect(pageJSF);
        }
    }// redirectCliente

    /**
     * Consente di effettuare un REDIRECT in caso in cui si cerca di accedere
     * con un account diverso dal Moderatore.
     *
     * @param pageJSF Pagina su cui effettuare il redirect, se null il redirect
     * avviene sull'index.
     * @param gestioneModeratore Parametro contenete l'id del moderatore.
     */
    public void redirectModeratore(GestioneSito gestioneModeratore, String pageJSF) {


        if (gestioneModeratore.getIdModeratore() == null) {

            this.redirect(pageJSF);
        }
    }// redirectModeratore

    /**
     * Il metodo regolamenta l'accesso alla pagina gestoreSito. IL REDIRECT si
     * attiva quando sia il supervisore che il moderatore hanno id = null.
     *
     * @param gestioneSito Parametro contenente l'id del supervisore, del
     * moderatore e dell'amministratore.
     * @param pageJSF Pagina jsf su cui attivare il redirect, se null, il
     * redirect avviene sull'index.
     */
    public void redirectGestoreSito(GestioneSito gestioneSito, String pageJSF) {

        if (gestioneSito.getIdSupervisore() == null && gestioneSito.getIdModeratore() == null && gestioneSito.getIdAmministratore() == null) {

            this.redirect(pageJSF);
        }
    }// redirectGestoreSito

    /**
     * Il metodo regolamenta l'accesso alla pagina gestoreSito. IL REDIRECT si
     * attiva quando l'addetto ha id = null.
     *
     * @param gestioneNegozio Parametro contenente l'id del addetto.
     * @param pageJSF Pagina jsf su cui attivare il redirect, se null, il
     * redirect avviene sull'index.
     */
    public void redirectAddettoNegozio(GestioneNegozio gestoreNegozio, String pageJSF) {

        if (gestoreNegozio.getAddetto() == null) {

            this.redirect(pageJSF);
        }
    }// redirectAddettoNegozio

    public void logout() {

        ((HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false)).invalidate();

        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        FacesContext fc = FacesContext.getCurrentInstance();
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(fc);

        try {

            ec.redirect("/E-Market-war/Login.jsf");
        } catch (IOException ex) {

            Logger.getLogger(Redirect.class.getName()).log(Level.SEVERE, null, ex);
            ExceptionThrower.throwMessageError(fc, rb, "redirectErrorM");
        }
    }// logout

    /**
     * Creates a new instance of Redirect
     */
    public Redirect() {
    }

    @PostConstruct
    public void init() {

        this.accesso = false;
        this.persona = null;
    }
}
